datasets

1. Analysis by geography

1.1 Comparing beneficiaries reached and PIN by state and region

The PIN figures originated from the WFP township-level calculations for the FSC based on the combination of food insecure persons and IDPs.

Currently the beneficiaries reached by the Food Security Cluster far exceed the figures for People in Need established in 2021. 2,088,142 have been reached throughout the first three quarters of 2021; this is 71% of the cluster PIN; however, as we can see, the response has been heavily skewed towards Yangon and Rakhine.

1.2 Beneficiaries and PIN by state and region

Joining, by = “admin3_pcode”

Beneficiaries reached and PIN by state/region
state beneficiaries %_of_ben PIN %_of_PIN %_PIN_reached
Yangon 1,274,906 61.27 1,946,729 14.58 65.49
Rakhine 430,247 20.68 1,000,300 7.49 43.01
Kachin 87,452 4.2 565,037 4.23 15.48
Mon 43,442 2.09 479,600 3.59 9.06
Kayah 15,920 0.77 175,915 1.32 9.05
Kayin 46,932 2.26 521,733 3.91 9
Shan (North) 64,794 3.11 1,040,211 7.79 6.23
Chin 13,550 0.65 297,681 2.23 4.55
Mandalay 24,829 1.19 774,956 5.8 3.2
Ayeyarwady 55,276 2.66 1,873,441 14.03 2.95
Shan (South) 9,304 0.45 993,317 7.44 0.94
Sagaing 8,090 0.39 870,919 6.52 0.93
Bago (East) 4,312 0.21 729,561 5.46 0.59
Magway 1,695 0.08 855,823 6.41 0.2
Bago (West) 0 0 500,694 3.75 0
Shan (East) 0 0 367,238 2.75 0
Tanintharyi 0 0 362,733 2.72 0
Nay Pyi Taw 0 0 0 0 NA

In general, there is large mismatch between a state’s share of beneficiaries and its share of the PIN – notably, Yangon constitutes 61% of all beneficiaries but only 15% of the nationwide PIN. Although Yangon has the highest share of people in need, it should also be stressed that the percentage of it’s population that is vulnerable – that is, either food insecure or internally displaced – is one of the lowest in the country, at 22%, with only Magway, Sagaing and Mandalay having lower percentages:

Vulnerability here has been defined as the proportion of the population who are

1.3 Township-level

Just as the response has been very skewed at the state and region level, the same is true at the township level. These 10 townships below are where 80% of all beneficiaries have been reached despite only constituting 15% of the PIN – in particular, Dagon Myothit (Seikkan) and Hlaingtharya have beneficiary figures that are 633% and 430% of their PIN respectively. For reference, the median percentage of people in need covered per township in the areas we work in is 7%.

Top 10 townships by beneficiaries reached
township beneficiaries pc_of_total pin pc_of_pin pc_reached partners
Hlaingtharya 772,658 37 179,313 3.52 430.9 5
Dagon Myothit (Seikkan) 276,430 13.24 43,650 0.86 633.3 2
Dala 170,463 8.16 45,060 0.88 378.3 3
Sittwe 147,864 7.08 128,717 2.53 114.9 9
Buthidaung 106,815 5.12 27,219 0.53 392.4 4
Maungdaw 80,348 3.85 16,889 0.33 475.7 6
Pauktaw 33,907 1.62 75,096 1.47 45.15 5
Kawkareik 30,867 1.48 70,417 1.38 43.83 2
Lashio 29,963 1.43 132,229 2.6 22.66 1
Kyaikmaraw 28,590 1.37 45,633 0.9 62.65 1

107 townships have been reached by food security activities in the first three-quarters of 2021. This is less than a third of the 330 townships in the country.

1.4 Locations

Partners have responded in a total of 1563across the country, with the vast majority of locations only having only one partner operating in them. Of the 5776 rows reported in the 5Ws, only 156 did not have any location reported.

Locations are classified into three groups – camps, industrial zones and villages/towns/wards:

Summary of location types
location_type locations townships beneficiaries pc_of_ben avg_ben_per_loc
village_ward_town 1,157 90 1,422,282 81.42 1,229
camp 421 38 316,648 18.13 752
industrial_zone 5 2 7,870 0.45 1,574

The vast majority of locations are served by only one partner. Below are a series of histograms showing the variation in the number of beneficiaries by location, split by number of partners in each location:

The more partners operating in a given location, the higher the average number of beneficiaries; however, it should be noted that these multi-sector locations are comparatively rare:

summarise() has grouped output by ‘location’. You can override using the .groups argument.

partners locations avg_beneficiaries
one_partner 1,496 182
two_partners 61 676
three_partners 11 859

2. Activities and modalities

2.1 Progress by activity

Partners reported their achievements across 8 5W activities. It is interesting to note that almost all the beneficiaries monthly cash transfers were established very early on (or had been established prior to 2021), with new beneficiaries being added very incrementally throughout the year. This speaks to one of the difficulties of interpreting this data – that these patterns are more reflective of partners’ reporting behaviours rather than they are of changes in the field. For instance – was there truly a massive leap in techical training in September, or did a partner report all their achievements at once? Nevertheless, this section will explore the data as it exists to understand what meaningful analysis can be drawn from it.

2.1 Delivery modalilties

Cash is the preferred delivery modality for four out of the nine activities under the Food Security Cluster, followed by “in-kind”, which is the preferred modality in three. However, the in-kind modality has the highest reach, given the especially large beneficiary numbers originating from the provision of monthly food baskets.

It must be noted, however, that a key piece of missing information not currently captured by the 5W template is the duration of these activities – the number of months a monthly food basket is provided cannot be reliably calculated from the data we currently have on hand. We also note several misclassifications – small portions of monthly cash transfers have been coded as in-kind and there are in-kind food baskets coded as hybrid. It might also be worth considering the distinction between “support for income-generating activities” and the “provision of technical training” as service delivery and support are heavily present in both.

summarise() has grouped output by ‘delivery_modality’. You can override using the .groups argument.

Delivery modalities by frequency
delivery_modality First Monthly One-off Other NA Total pc_of_Total
In-kind 303,595 73,665 291,175 1,063,779 40,697 1,772,911 84.9
Cash 894 202,556 64,535 2,973 228 271,186 12.99
Hybrid (In-kind & Cash) NA 11,026 2,488 10,503 NA 24,017 1.15
Service delivery/support NA 2,072 6,040 4,620 NA 12,732 0.61
Voucher NA NA 2,519 4,777 NA 7,296 0.35
Total 304,489 289,319 366,757 1,086,652 40,925 2,088,142 100

In-kind support was by far the most common delivery modality, with 85% of unique beneficiaries receiving support through that means. 13% of beneficiaries were reached by cash transfers. I believe the “other” frequency should be dropped as an option in the 5W template and replaced with more specific options as it is unclear if it refers to interventions that repeat more frequently than once a month or less. It might also be that partners are selecting “other” instead of leaving the field blank. It might be possible to backfill most the the “other” values from the beneficiaries_recurrency column – this will be explore further in the section on beneficiaries.

2.2 Value of intervention packages per household

We note that the most common transfer values – in terms of beneficiaries reached – are between USD 10 and USD 20, though it should be noted – and can be more clearly seen from the table below, a not insignifcant number of beneficiaries were reached by cash transfer interventions valued at more than USD 100 per household.

Cash transfer, hybrid and voucher values per household by frequency of transfer (USD)
transfer_value First Monthly One-off Other Total pc_of_Total
below_$10 185 30,682 2,126 9,543 42,536 14.82
$10_$20 241 122,979 8,002 502 131,724 45.9
$20_$40 242 11,335 13,756 1,881 27,214 9.48
$40_$60 226 29,536 12,850 188 42,800 14.91
$60_$100 NA 9,826 4,850 4,912 19,588 6.83
$100_$200 NA 413 14,255 789 15,457 5.39
above_$200 NA 23 7,204 438 7,665 2.67

Next, let us take a look at household package values by activity type:

An avenue to explore here would be the provision of monthly cash transfers – this activity has a very clear peak at $10-$20. A closer look at the data reveals this almost entirely due 122,854 beneficiaries who received monthly transfers of USD 10.50 per household; it is unclear whether USD 10.50 per household would be sufficient to cover their monthly food needs – we should cross-reference this with the calculations for minimum expenditure baskets – but it certainly is doubtful. Perhaps this type of relatively low-value transfer should be reclassified as a supplementary intervention not meant to cover a household food security needs. 7 partners currently provide this type of monthly transfer – Save the Children, WFP, Myanmar Heart Organisation, People for People, Plan International, World Vision Myanmar and Karuna Mission Social Solidarity; we should follow up with them to understand if this sum (equivalent to MMK 15,000) is truly meant to cover monthly food expenditures.

The two peaks in “support for income-generating activities” ($10-$20 and above_$200) are an order of magnitude apart – it not inconceivable that they should be split into two separate activities.

Some partners have also reported the value of the food baskets they are distributed; however, these only represent a small fraction of the total (less than 1%, by beneficiaries) and it would be much more preferable to collect the actual contents of these food baskets for analysis than use the data in the 5Ws.

3. Partners

Partners fairly evenly split themselves between HRP indicators, with 29 contributing towards food and cash assistance and 28 contributing towards agriculture and other livelihood support. As a reference, 28 partners have reached less than 10,000 unique beneficiaries and the median unique beneficiaries reached by partners is 4,697. Below are the top 10 partners by HRP indicator.

Top 10 partners by beneficiaries reached, by HRP indicator
Partners HRP indicator 1 1. Number of people who received food and/or cash assistance Partners HRP indicator 2 2. Number of people who received agriculture and other livelihood support
Open Data Myanmar (ODM) 304,919 Center for Social Integrity (CSI) 28,725
MRCS 263,005 Action Contre la Faim 19,109
Zigway 223,478 Action for Green Earth 16,037
Hlaingthayar Development Network 189,701 World Vision Myanmar 15,303
World Vision Myanmar 168,698 Myanmar Heart Development Organization 9,867
Urban Strength (US) 128,878 WFP 7,691
WFP 105,984 Save the Children 7,543
Hlaingthayar Youth Network 96,145 Phyu Sin Saydanar Action Group 6,052
Action for Green Earth 67,578 BRAC Myanmar 5,162
Myanmar Heart Development Organization 63,838 MRCS 5,051

Distribution of partners by beneficiaries and geographic reach

mouse over for details

Whilst there is quite a bit of variation in the number of beneficiaries reached, we can see that partners’ geographic footprints are – on the whole – quite limited. Only 4 out of 47 partners have a presence in more than 10 townships, with only 10 being present in more than 5. 79% of our partners (clustered along the bottom of the chart) are present in 5 or less townships. If the response is truly meant to be countrywide, it is imperative to understand what would incentivise partners to expand their footprints.

Map of number of partners and people in need by state/region

There are 58 combinations between reporting organisations and implementing partners, 19 of which are instances where the reporting organisation and the implementing partner and the same organisation; once these 19 are filtered out, all the remaining implementing partners correspond to just 10 reporting organisations:

Number of implementing partners by reporting organisation
reporting_organization implementing_partners
WFP 21
Save the Children 4
FAO 3
Finn Church Aid 3
Mercy Corps 2
Trocaire 2
AVSI 1
Danish Refugee Council 1
Helvetas 1
Oxfam 1
Beneficiaries by implmenting partner type
implementing_partner_type beneficiaries townships
INGO 1,469,735 55
NNGO 2,779,172 60
UN 1,245,381 52

Beneficiaries

summarise() has grouped output by ‘state’. You can override using the .groups argument.

Percentage of beneficiaries by type, by state/region
state Host/local Community Internally Displaced Returnees Rakhine stateless beneficiaries
Ayeyarwady 100 NA NA NA 55,276
Bago (East) NA 100 NA NA 4,312
Chin 9.225 90.77 NA NA 13,550
Kachin 6.486 91.8 1.714 NA 87,452
Kayah 45.89 54.11 NA NA 15,920
Kayin 89.99 10.01 NA NA 46,932
Magway 100 NA NA NA 1,695
Mandalay 100 NA NA NA 24,829
Mon 91.68 6.524 1.795 NA 43,442
Rakhine 19.17 12.5 NA 68.33 430,247
Sagaing 100 NA NA NA 8,090
Shan (East) 100 NA NA NA 510
Shan (North) 25.69 74.31 NA NA 71,677
Shan (South) 100 NA NA NA 9,304
Yangon 100 NA NA NA 1,274,906
Total 75.27 10.54 0.1091 14.08 NA

The states and sub-regions in which we are working the most with IDPs are Bago (East), Kachin, Chin, Shan (North) and Kayah. Overall, 75% of beneficiaries are from the host/local community, 14% are stateless persons from Rakhine and 11% are IDPs.

## # A tibble: 3 x 3
## # Groups:   beneficiaries_recurrency [3]
##   beneficiaries_recurrency frequency beneficiaries
##   <chr>                    <chr>             <dbl>
## 1 First                    Other           1044698
## 2 One-off                  Other             41974
## 3 Recurrent                Other            367867

LS0tDQp0aXRsZTogIkluaXRpYWwgcmVwb3J0IG9uIHRoZSBNeWFubWFyIEZvb2QgU2VjdXJpdHkgNVdzIg0KYXV0aG9yOiAiU2VhbiBOZyINCmRhdGU6ICIyNC8xMS8yMDIxIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICANCi0tLQ0KDQo8c3R5bGU+DQogICAgYm9keSAubWFpbi1jb250YWluZXIgew0KICAgICAgICBtYXgtd2lkdGg6IDEyODBweDsNCiAgICB9DQo8L3N0eWxlPg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIGZpZy53aWR0aD05LCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHN0cmluZ2kpDQpsaWJyYXJ5KHBhbmRlcikNCmxpYnJhcnkoamFuaXRvcikNCmxpYnJhcnkoZnV6enlqb2luKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KbGlicmFyeShzZikNCmxpYnJhcnkoYm9va2Rvd24pDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpsaWJyYXJ5KGdnc2ZsYWJlbCkNCmxpYnJhcnkocGF0Y2h3b3JrKQ0KbGlicmFyeShwbG90bHkpDQoNCnRoZW1lX3NldCh0aGVtZV9saWdodCgpKQ0KDQojIGRpc2FibGluZyBzY2llbnRpZmljIG5vdGF0aW9uDQpvcHRpb25zKHNjaXBlbiA9IDEwMCkNCg0KIyBwYW5kZXIgdGFibGVzIGFsbCBpbiBvbmUgcm93DQpwYW5kZXJPcHRpb25zKCd0YWJsZS5zcGxpdC50YWJsZScsIEluZikNCg0KIyBwYW5kZXIgdGhvdXNhbmRzIHNlcGFyYXRvcg0KcGFuZGVyT3B0aW9ucygiYmlnLm1hcmsiLCAiLCIpDQoNCmAlb3V0JWAgPC0gTmVnYXRlKGAlaW4lYCkNCg0KIyBmdW5jdGlvbiBmb3IgdHJhbnNwb3NpbmcgZGYNCnRyYW5zcG9zZV9kZiA8LSBmdW5jdGlvbihkZikgew0KICB0X2RmIDwtIGRhdGEudGFibGU6OnRyYW5zcG9zZShkZikNCiAgY29sbmFtZXModF9kZikgPC0gcm93bmFtZXMoZGYpDQogIHJvd25hbWVzKHRfZGYpIDwtIGNvbG5hbWVzKGRmKQ0KICB0X2RmIDwtIHRfZGYgJT4lDQogICAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oLmRhdGEgPSAuKSAlPiUNCiAgICB0aWJibGU6OmFzX3RpYmJsZSguKQ0KICByZXR1cm4odF9kZikNCn0NCg0KIyBmdW5jdGlvbiBiZW5lZmljaWFyeSBzdW1tYXJpZXMNCmZzY2JlbiA8LSBmdW5jdGlvbihkZiwgY29sdW1uX3Zhcil7DQogIA0KICBjb2x1bW5fdmFyIDwtIGVucXVvKGNvbHVtbl92YXIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIpICU+JSAjIG11c3QgYWRkIGJhbmctYmFuZw0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKQ0KICAgIA0KIH0NCg0KYGBgDQoNCiMjIyBkYXRhc2V0cw0KDQpgYGB7ciBkYXRhc2V0cywgaW5jbHVkZT1GQUxTRX0NCg0KIyBpbmRpY2F0b3IgZ3VpZGUgZm9yIHZ1bG1tcg0KaW5kaWNhdG9yX2d1aWRlIDwtIHJlYWRfZXhjZWwoIkRhdGFzZXRzX1Z1bG5lcmFiaWxpdHlfQW5hbHlzaXNfaW5fTXlhbm1hcl8wOUp1bDIwMTggKDEpLnhsc3giLA0KICAgICAgICAgICBza2lwID0gMSkgJT4lIA0KICBzbGljZSgxOjMpICU+JSANCiAgamFuaXRvcjo6Y2xlYW5fbmFtZXMoKSAlPiUgDQogIHRyYW5zcG9zZV9kZigpICU+JSANCiAgcmVuYW1lKGluZGljYXRvciA9IHJvd25hbWUsIA0KICAgICAgICAgYWdlX2dyb3VwID0gYDFgLA0KICAgICAgICAgY2F0ZWdvcnkgPSBgMmAsIA0KICAgICAgICAgc291cmNlID0gYDNgKSAlPiUgDQogIHNsaWNlKC0xKQ0KDQojIHJlYWRpbmcgaW4gdnVsbmVyYWJpbGl0eSBkYXRhc2V0DQp2dWxtbXIgPC0gcmVhZF9leGNlbCgiRGF0YXNldHNfVnVsbmVyYWJpbGl0eV9BbmFseXNpc19pbl9NeWFubWFyXzA5SnVsMjAxOCAoMSkueGxzeCIsDQogICAgICAgICAgIHNraXAgPSAxKSAlPiUgDQogIHNsaWNlKC1jKDE6MykpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUgDQogIHNlbGVjdCgtbGFiZWwpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMobnVtYmVyX29mX3ZpbGxhZ2VfdHJhY3RzOndiX3dlYWx0aF9yYW5rKSwgYXMubnVtZXJpYykgJT4lIA0KICBtdXRhdGVfYXQodmFycyhkaXNhc3RlcnNfaW1wYWN0ZWRfYnlfbmFyZ2lzXzIwMDg6YWNsZWRfMjAxNV8yMDE2X2RhdGFfZXhpc3RzKSwgYXMubG9naWNhbCkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhjb25mbGljdF8yMDE1XzIwMTZfbnVtYmVyX29mX2JhdHRsZXM6Y29ycmVjdGVkX2NvbmZsaWN0X2luZGV4X2dhcnJ5KSwgYXMubnVtZXJpYykgJT4lIA0KICBzZWxlY3QoLXN0YXJ0c193aXRoKCJ4IikpICU+JSANCiAgc2VsZWN0KC1jKHByaXZhdGVfc2VjdG9yX2RldmVsb3BtZW50XzIwMTRfMjAxNSwgcHJvdGVjdGlvbl8yMDEwXzIwMTUsIHNoZWx0ZXJfMjAxMF8yMDE1LCB3YXNoXzIwMTBfMjAxNSkpIA0KDQojIHJlYWRpbmcgaW4gdG93bnNoaXBzIGZyb20gZ2VvYWRtaW5zIA0KdG93bnNoaXBzIDwtIHJlYWRfZXhjZWwoIkZTQyA1VyAyMDIxIC0gR0VPQURNSU5TX2ZpbmFsIDE5Lnhsc3giLA0KICAgICAgICAgICBzaGVldCA9ICJHRU9BRE1JTlMiKSAlPiUgDQogIGNsZWFuX25hbWVzKCkgJT4lIA0KICBzZWxlY3QoYWRtaW4xcGNvZGVfNDphZG1pbjNwY29kZSkgJT4lIA0KICByZW5hbWUoYWRtaW4xX3Bjb2RlID0gYWRtaW4xcGNvZGVfNCwNCiAgICAgICAgIGFkbWluM19wY29kZSA9IGFkbWluM3Bjb2RlLA0KICAgICAgICAgc3RhdGVfbmFtZSAgID0gc3RhdGVfNSwNCiAgICAgICAgIHRvd25zaGlwX25hbWUgID0gY291bnR5KSAlPiUgDQogIHJlbW92ZV9lbXB0eSgpDQoNCiMgbG9jYXRpb25zIGRhdGFzZXQgDQpsb2NhdGlvbnMgPC0gYmluZF9yb3dzKA0KICANCiAgcmVhZF9leGNlbCgiRlNDIDVXIDIwMjEgLSBHRU9BRE1JTlNfZmluYWwgMTkueGxzeCIsICMgcGF5YW1zIA0KICAgICAgICAgICAgIHNoZWV0ID0gIkdFT0FETUlOUyIpICU+JSANCiAgICBjbGVhbl9uYW1lcygpICU+JSANCiAgICBzZWxlY3Qoc3RhdGVfbmFtZTpwYXlhbV9jb2RlKSAlPiUgDQogICAgcmVuYW1lKGFkbWluMV9wY29kZSA9IHN0YXRlX2NvZGVfMTIsDQogICAgICAgICAgIHRvd25zaGlwX25hbWUgPSBjb3VudHlfbmFtZSwgDQogICAgICAgICAgIGFkbWluM19wY29kZSA9IGNvdW50eV9jb2RlLA0KICAgICAgICAgICBsb2NhdGlvbiA9IHBheWFtX25hbWUpICU+JQ0KICAgIHJlbW92ZV9lbXB0eSgpICU+JSANCiAgICBtdXRhdGUobG9jYXRpb25fdHlwZSA9IHBhc3RlMCgicGF5YW0iKSksDQogIA0KICByZWFkX2V4Y2VsKCJGU0MgNVcgMjAyMSAtIEdFT0FETUlOU19maW5hbCAxOS54bHN4IiwgIyBjYW1wcw0KICAgICAgICAgICAgIHNoZWV0ID0gIkdFT0FETUlOUyIpICU+JSANCiAgICBjbGVhbl9uYW1lcygpICU+JSANCiAgICBzZWxlY3QoY291bnR5X25hbWUxOnBfY29kZV9jYW1wKSAlPiUgDQogICAgcmVuYW1lKHRvd25zaGlwX25hbWUgPSBjb3VudHlfbmFtZTEsDQogICAgICAgICAgIGFkbWluM19wY29kZSA9IHN0YXRlX2NvZGVfMjMsDQogICAgICAgICAgIGxvY2F0aW9uID0gY2FtcHMsIA0KICAgICAgICAgICBjYW1wX3Bjb2RlID0gcF9jb2RlX2NhbXApICU+JSANCiAgICByZW1vdmVfZW1wdHkoKSAlPiUgDQogICAgbXV0YXRlKGxvY2F0aW9uX3R5cGUgPSBwYXN0ZTAoImNhbXAiKSkgJT4lIA0KICAgIGxlZnRfam9pbih0b3duc2hpcHMgJT4lIHNlbGVjdChzdGF0ZV9uYW1lLCBhZG1pbjFfcGNvZGUsIGFkbWluM19wY29kZSksIA0KICAgICAgICAgICAgICBieSA9IGMoImFkbWluM19wY29kZSIpKSAlPiUgDQogICAgcmVsb2NhdGUoYWRtaW4xX3Bjb2RlKSAlPiUgDQogICAgcmVsb2NhdGUoc3RhdGVfbmFtZSksDQogIA0KICByZWFkX2V4Y2VsKCJGU0MgNVcgMjAyMSAtIEdFT0FETUlOU19maW5hbCAxOS54bHN4IiwgIyBpbmR1c3RyaWFsIHpvbmVzDQogICAgICAgICAgICAgc2hlZXQgPSAiR0VPQURNSU5TIikgJT4lIA0KICAgIGNsZWFuX25hbWVzKCkgJT4lDQogICAgc2VsZWN0KHN0YXRlXzI4OmluZHVzdHJpYWxfem9uZXMpICU+JSANCiAgICByZW5hbWUoc3RhdGVfbmFtZSA9IHN0YXRlXzI4LCANCiAgICAgICAgICAgYWRtaW4xX3Bjb2RlID0gYWRtaW4xcGNvZGVfMjksDQogICAgICAgICAgIGxvY2F0aW9uID0gaW5kdXN0cmlhbF96b25lcykgJT4lDQogICAgcmVtb3ZlX2VtcHR5KCkgJT4lIA0KICAgIHJlZ2V4X2xlZnRfam9pbih0b3duc2hpcHMgJT4lIHNlbGVjdCh0b3duc2hpcF9uYW1lLCBhZG1pbjNfcGNvZGUpLA0KICAgICAgICAgICAgICAgICAgICBieSA9IGMoImxvY2F0aW9uIiA9ICJ0b3duc2hpcF9uYW1lIikpICU+JSANCiAgICAjIHJlcGxhY2luZyB0aGUgTkFzIHdpdGggMHMgc28gdGhlIGZpbHRlciBkb2Vzbid0IGRyb3AgdGhlbSANCiAgICByZXBsYWNlX25hKGxpc3QodG93bnNoaXBfbmFtZSA9IDAsIGFkbWluM19wY29kZSA9IDAsIGFkbWluMV9wY29kZSA9IDApKSAlPiUNCiAgICBmaWx0ZXIoYWRtaW4zX3Bjb2RlICE9ICJNTVIwMTMwNDAiKSAlPiUgIyByZW1vdmluZyBhbGwgdGhlIG1hdGNoZXMgYmV0d2VlbiBIbGFpbmd0aGFyeWEgYW5kIEhsYWluZw0KICAgIGZpbHRlcihhZG1pbjNfcGNvZGUgIT0gIk1NUjAxMTAwNiIpICU+JSAjIHJlbW92aW5nIGFsbCB0aGUgbWF0Y2hlcyBiZXR3ZWVuIFllbmFuZ3lhdW5nIGFuZCBZZQ0KICAgIG11dGF0ZShsb2NhdGlvbl90eXBlID0gcGFzdGUwKCJpbmR1c3RyaWFsX3pvbmUiKSkNCiAgDQopJT4lDQogIG11dGF0ZShsb2NhdGlvbl9jb2RlID0gY2FzZV93aGVuKGxvY2F0aW9uX3R5cGUgPT0gImNhbXAiIH4gY2FtcF9wY29kZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25fdHlwZSA9PSAicGF5YW0iIH4gcGF5YW1fY29kZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25fdHlwZSA9PSAiaW5kdXN0cmlhbF96b25lIiB+IE5BX2NoYXJhY3Rlcl8pKSAlPiUNCiAgbXV0YXRlKGxvY2F0aW9uc19mdXp6eSA9IHN0cl9yZXBsYWNlX2FsbChsb2NhdGlvbiwgIltbOnB1bmN0Ol1dIiwgIiIpKQ0KDQojIHJlYWRpbmcgaW4gNXdzDQpmc2MgPC0gcmVhZF9leGNlbCgNCiAgIkZTQyA1VyAyMDIxIC0gR0VPQURNSU5TX2ZpbmFsMTlfKGluY2x1ZGVkIEFsbCBJUCBSZXBvcnRzKV9KYW4gdG8gU2VwIDIwMjFfSU0gQ29tYmluZWRfRmluYWwueGxzeCIsDQogICAgICAgICAgICAgICAgICBzaGVldCA9ICJGU0MgNVcgQWN0aXZpdGVzIiwNCiAgICAgICAgICAgICAgICAgIHNraXAgPSA1KSAlPiUgDQogIGphbml0b3I6OmNsZWFuX25hbWVzKCkgJT4lIA0KICBzZWxlY3QobW9udGhfb2ZfaW1wbGVtZW50YXRpb246aHJwX3ZlcnNpb24pICU+JSANCiAgcmVuYW1lX2FsbCh+c3RyX3JlcGxhY2VfYWxsKC4sICJebnVtYmVyX29mXyIsICIiKSkgJT4lDQogIHJlbmFtZV9hbGwofnN0cl9yZXBsYWNlX2FsbCguLCAiXm51bWJlcl8iLCAiIikpICU+JSANCiAgcmVuYW1lKGFkbWluNF9wY29kZSA9IGFkbWluM19wY29kZSwgDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBhZG1pbjJfcGNvZGUsDQogICAgICAgICBiZW5lZmljaWFyaWVzID0gcmVhY2hlZF9iZW5lZmljaWFyaWVzLA0KICAgICAgICAgaG91c2Vob2xkcyA9IHJlYWNoZWRfaG91c2Vob2xkcywNCiAgICAgICAgIGJlbmVmaWNpYXJ5X3R5cGUgPSBiZW5lZmljaWFyaWVzX3R5cGUpICU+JSANCiAgbXV0YXRlKGluZHVzdHJpYWxfem9uZXMgPSByZXBsYWNlKGluZHVzdHJpYWxfem9uZXMsIGluZHVzdHJpYWxfem9uZXMgPT0gIk5vIiwgTkEpLA0KICAgICAgICAgZnJlcXVlbmN5ID0gcmVwbGFjZShmcmVxdWVuY3ksIGZyZXF1ZW5jeSA9PSAiTi9BIiwgTkEpKSAlPiUgDQogIG11dGF0ZShsb2NhdGlvbiA9IGNhc2Vfd2hlbihjYW1wICE9ICJOQSIgfiBjYW1wLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kdXN0cmlhbF96b25lcyAhPSAiTkEiIH4gaW5kdXN0cmlhbF96b25lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpbGxhZ2Vfd2FyZF90b3duICE9ICJOQSIgfiB2aWxsYWdlX3dhcmRfdG93bikpICU+JSANCiAgbXV0YXRlKGxvY2F0aW9uX3R5cGUgPSBjYXNlX3doZW4oY2FtcCAhPSAiTkEiIH4gImNhbXAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kdXN0cmlhbF96b25lcyAhPSAiTkEiIH4gImluZHVzdHJpYWxfem9uZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWxsYWdlX3dhcmRfdG93biAhPSAiTkEiIH4gInZpbGxhZ2Vfd2FyZF90b3duIikpICU+JQ0KICBtdXRhdGUobG9jYXRpb25zX2Z1enp5ID0gc3RyX3JlcGxhY2VfYWxsKGxvY2F0aW9uLCAiW1s6cHVuY3Q6XV0iLCAiICIpKSAlPiUgDQogIG11dGF0ZSh0b3RhbF92YWx1ZV9tbWsgPSB2YWx1ZV9wZXJfaG91c2Vob2xkICogaG91c2Vob2xkcykgJT4lIA0KICBtdXRhdGUoZGF0ZSA9IG15KG1vbnRoX29mX2ltcGxlbWVudGF0aW9uKSkgJT4lIA0KICBtdXRhdGUodV9iZW4gPSBpZmVsc2UodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIsIGJlbmVmaWNpYXJpZXMsIDApKSAlPiUgDQogIG11dGF0ZShzdGF0ZSA9IGFzLmNoYXJhY3RlcihmY3RfcmVjb2RlKHN0YXRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2FjaGluIiA9ICJrYWNoaW4iKSkpICU+JSANCiAgbXV0YXRlKG1ta19oaGRfYmluID0gY2FzZV93aGVuKHZhbHVlX3Blcl9ob3VzZWhvbGQgPCAxMDAwMCB+ICJiZWxvd18xMGsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wZXJfaG91c2Vob2xkID49IDEwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8PSAyMDAwMCB+ICIxMGtfMjBrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZCA+IDIwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8PSA1MDAwMCB+ICIyMGtfNTBrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZCA+IDUwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8PSA3MDAwMCB+ICI1MGtfNzBrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZCA+IDcwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8IDEwMDAwMCB+ICI3MGtfMTAwayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGQgPj0gMTAwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8IDIwMDAwMCB+ICIxMDBrXzIwMGsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wZXJfaG91c2Vob2xkID49IDIwMDAwMCAmIHZhbHVlX3Blcl9ob3VzZWhvbGQgPD0gMzAwMDAwIH4gIjIwMGtfMzAwayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGQgPiAzMDAwMDAgfiAiYWJvdmVfMzAwayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSwNCiAgICAgICAgIG1ta19oaGRfYmluID0gZmN0X3JlbGV2ZWwobW1rX2hoZF9iaW4sIGMoImxlc3NfdGhhbl8xMGsiLCAiMTBrXzIwayIsIjIwa181MGsiLCAiNTBrXzcwayIsICI3MGtfMTAwayIsICIxMDBrXzIwMGsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMGtfMzAwayIsIm1vcmVfdGhhbl8zMDBrIikpLA0KICAgICAgICAgZnJlcXVlbmN5ID0gcmVjb2RlKGZyZXF1ZW5jeSwgIm1vbnRobHkiID0gIk1vbnRobHkiKSkgJT4lDQogIG11dGF0ZSh1c2RfaGhkX2JpbiA9IA0KICAgICAgICAgICBjYXNlX3doZW4odmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPCAxMCB+ICJiZWxvd18kMTAiLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPj0gMTAgJiB2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA8IDIwIH4gIiQxMF8kMjAiLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPj0gMjAgJiB2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA8IDQwIH4gIiQyMF8kNDAiLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPj0gNDAgJiB2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA8IDYwIH4gIiQ0MF8kNjAiLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPj0gNjAgJiB2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA8IDEwMCB+ICIkNjBfJDEwMCIsDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA+PSAxMDAgJiB2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA8IDIwMCB+ICIkMTAwXyQyMDAiLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPj0gMjAwIH4gImFib3ZlXyQyMDAiLA0KICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pLA0KICAgICAgICAgdXNkX2hoZF9iaW4gPSBmY3RfcmVsZXZlbCh1c2RfaGhkX2JpbiwgYygiYmVsb3dfJDEwIiwgIiQxMF8kMjAiLCAiJDIwXyQ0MCIsICIkNDBfJDYwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkNjBfJDEwMCIsICIkMTAwXyQyMDAiLCAiYWJvdmVfJDIwMCIpKSkgJT4lIA0KICBtdXRhdGUoaHJwX2luZGljYXRvciA9DQogICAgICAgICAgcmVjb2RlKGhycF9pbmRpY2F0b3IsDQogICAgICAgICAgIk51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGZvb2QgYW5kL29yIGNhc2ggYXNzaXN0YW5jZSIgPSANCiAgICAgICAgICAgICIxLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBmb29kIGFuZC9vciBjYXNoIGFzc2lzdGFuY2UiLA0KICAgICAgICAgICJOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBhZ3JpY3VsdHVyZSBhbmQgb3RoZXIgbGl2ZWxpaG9vZCBzdXBwb3J0LCBjb250cmlidXRpbmcgdG8gaG91c2Vob2xkIGZvb2Qgc2VjdXJpdHkiID0NCiAgICAgICAgICAgICIyLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBhZ3JpY3VsdHVyZSBhbmQgb3RoZXIgbGl2ZWxpaG9vZCBzdXBwb3J0IikpICU+JSANCiAgbXV0YXRlKGJlbmVmaWNpYXJ5X3R5cGUgPSBzdHJfdHJpbShiZW5lZmljaWFyeV90eXBlKSkgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcnlfdHlwZSA9IGFzLmNoYXJhY3RlcihmY3RfcmVjb2RlKGJlbmVmaWNpYXJ5X3R5cGUsIA0KICAgICAgICAgICAgICAgIlJha2hpbmUgc3RhdGVsZXNzIiA9ICJOb24tZGlzcGxhY2VkIHN0YXRlbGVzcyBwZW9wbGUgaW4gUmFraGluZSIpKSkNCiAgDQoNCiMgYmVuIGRhdGFzZXQgLS0gdGlkeSBmcm9tYXQgNVdzIGZvciBiZW5lZmljaWFyaWVzIA0KYmVuIDwtIGZzYyAlPiUgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lICANCiAgc2VsZWN0KGRhdGUsDQogICAgICAgICBpbXBsZW1lbnRpbmdfcGFydG5lcnMsIGltcGxlbWVudGluZ19wYXJ0bmVyX3R5cGUsDQogICAgICAgICBzdGF0ZSwgdG93bnNoaXAsIHZpbGxhZ2Vfd2FyZF90b3duLCBsb2NhdGlvbiwgbG9jYXRpb25fdHlwZSwgYWRtaW4xX3Bjb2RlLCBhZG1pbjNfcGNvZGUsDQogICAgICAgICBhY3Rpdml0eSwgYWN0aXZpdHlfc3RhdHVzLCBocnBfaW5kaWNhdG9yLCBiZW5lZmljaWFyeV90eXBlLCANCiAgICAgICAgIGNoaWxkX21hbGUsIGNoaWxkX2ZlbWFsZSwgYWR1bHRfbWFsZSwgYWR1bHRfZmVtYWxlLCBlbGRlcmx5X21hbGUsIGVsZGVybHlfZmVtYWxlKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gY2hpbGRfbWFsZTplbGRlcmx5X2ZlbWFsZSwgDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJkaXNhZ2dyZWdhdGlvbiIsIHZhbHVlc190byA9ICJiZW5lZmljaWFyaWVzIiwgdmFsdWVzX2Ryb3BfbmEgPSBUUlVFKQ0KIA0KDQojIHJlYWRpbmcgaW4gcGluIGFuZCB0YXJnZXRzDQpwaW4gPC0gcmVhZF9leGNlbCgiUElOIGNhbGN1bGF0aW9uIEZvb2QgU2VjdXJpdHkgQ2x1c3Rlcl9Ub3duc2hpcCBCcmVha2Rvd24ueGxzeCIsDQogICAgICAgICAgIHNoZWV0ID0gIkZvb2QgU2VjIFBpTiB3aXRoIElEUHMiLCANCiAgICAgICAgICAgc2tpcCA9IDIpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUgDQogIHNlbGVjdCgtYyh4MTUsIHgxNiwgeDE3LCB4MTgpKSAlPiUgDQogIHNsaWNlKDE6MzQ2KSAlPiUgDQogIGZpbGwocmVnaW9uKSAlPiUgDQogIHJlbmFtZShzdGF0ZSA9IHJlZ2lvbiwNCiAgICAgICAgIGlkcHMgPSBpZF9wcywgDQogICAgICAgICBwb3BfbWludXNfaWRwcyA9IHBvcHVsYXRpb25fbWludXNfaWRfcHMsIA0KICAgICAgICAgdG90YWxfcGluID0gdnVsbmVyYWJsZV9mb29kX2luc2VjdXJlX3Blb3BsZV9pZF9wcykgJT4lICANCiAgZmlsdGVyKHRvd25zaGlwICE9ICJUb3RhbCIpICU+JSAgDQogIG11dGF0ZV9hdCh2YXJzKHBvcF9taW51c19pZHBzOm1vZGVyYXRlbHlfc2V2ZXJlbHkpLCB+IGFzLm51bWVyaWMoLikpICU+JSANCiAgbGVmdF9qb2luKHRvd25zaGlwcywgYnkgPSBjKCJ0b3duc2hpcCIgPSAidG93bnNoaXBfbmFtZSIpKSAlPiUgDQogIHJlcGxhY2UoaXMubmEoLiksIDApICAlPiUgDQogIHNlbGVjdCgtc3RhdGUpICU+JSAgDQogIHJlbG9jYXRlKGFkbWluM19wY29kZSkgJT4lIHJlbG9jYXRlKHN0YXRlID0gc3RhdGVfbmFtZSkgJT4lIHJlbG9jYXRlKGFkbWluMV9wY29kZSkgJT4lIA0KICBtdXRhdGUocGNfdnVsID0gdG90YWxfcGluIC8gdG90YWxfcG9wLA0KICAgICAgICAgdG90YWxfcGluID0gcm91bmQodG90YWxfcGluLCBkaWdpdHMgPSAwKSkNCg0KIyBzaGFwZWZpbGVzDQpwY29kZTNfc2hhcGUgPC0gc3RfcmVhZCgiLi9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway5zaHAiLCBxdWlldCA9IFRSVUUpICU+JSANCiAgcmVuYW1lKHN0YXRlID0gU1QsIA0KICAgICAgICAgYWRtaW4xX3Bjb2RlID0gU1RfUENPREUsDQogICAgICAgICB0b3duc2hpcCA9IFRTLA0KICAgICAgICAgYWRtaW4zX3Bjb2RlID0gVFNfUENPREUpDQoNCnBjb2RlMV9zaGFwZSA8LSBzdF9yZWFkKCIuL21tcl9wb2xibmRhMl9hZG0xX21pbXVfMjUway9tbXJfcG9sYm5kYTJfYWRtMV9taW11XzI1MGsuc2hwIiwgcXVpZXQgPSBUUlVFKSAlPiUgDQogIHJlbmFtZShzdGF0ZSA9IFNULCANCiAgICAgICAgIGFkbWluMV9wY29kZSA9IFNUX1BDT0RFKQ0KDQojIGZvciByZWxldmVsbGluZyAtLSB0aGlzIGlzIGluIG9yZGVyIG9mIGJlbmVmaWNpYXJpZXMNCnNyX29yZCA8LSBjKCJZYW5nb24iLCAiUmFraGluZSIsIkthY2hpbiIsICJBeWV5YXJ3YWR5IiwgIktheWluIiwgIA0KICAiTW9uIiwgIk1hbmRhbGF5IiwgIktheWFoIiwgIkNoaW4iLCAiU2FnYWluZyIsICJNYWd3YXkiLCANCiAgIkJhZ28iLCAiTmF5IFB5aSBUYXciLCAiU2hhbiIsICJUYW5pbnRoYXJ5aSIpDQpgYGANCg0KDQojIyAxLiBBbmFseXNpcyBieSBnZW9ncmFwaHkNCg0KIyMjIDEuMSBDb21wYXJpbmcgYmVuZWZpY2lhcmllcyByZWFjaGVkIGFuZCBQSU4gYnkgc3RhdGUgYW5kIHJlZ2lvbiANCg0KYGBge3J9DQoNCnBpbiAlPiUgDQogIGxlZnRfam9pbihiZW4gJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpKSAlPiUgDQogIG11dGF0ZShiZW5lZmljaWFyaWVzID0gaWZlbHNlKGlzLm5hKGJlbmVmaWNpYXJpZXMpLCAwLCBiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICB0b3RhbF9waW4gPSBzdW0odG90YWxfcGluKSkgJT4lIA0KICBwaXZvdF9sb25nZXIoLXN0YXRlLCBuYW1lc190byA9ICJ0eXBlIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBmY3RfcmVsZXZlbChzdGF0ZSwgc3Jfb3JkKSwgeSA9IHZhbHVlLCBmaWxsID0gdHlwZSkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMC40LCBhbmdsZSA9IDcwKSkgKw0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgbGFicyh4ID0gIiIsDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJGb29kIHNlY3VyaXR5IGJlbmVmaWNpYXJpZXMgYW5kIHBlb3BsZSBpbiBuZWVkIikgKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMDAwMDAwLCBieSA9IDIwMDAwMCksIGxhYmVscyA9IGNvbW1hKQ0KDQogIA0KYGBgDQoNClRoZSBQSU4gZmlndXJlcyBvcmlnaW5hdGVkIGZyb20gdGhlIFdGUCB0b3duc2hpcC1sZXZlbCBjYWxjdWxhdGlvbnMgZm9yIHRoZSBGU0MgYmFzZWQgb24gdGhlIGNvbWJpbmF0aW9uIG9mIGZvb2QgaW5zZWN1cmUgcGVyc29ucyBhbmQgSURQcy4gDQoNCg0KPiBDdXJyZW50bHkgdGhlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBieSB0aGUgRm9vZCBTZWN1cml0eSBDbHVzdGVyIGZhciBleGNlZWQgdGhlIGZpZ3VyZXMgZm9yIFBlb3BsZSBpbiBOZWVkIGVzdGFibGlzaGVkIGluIDIwMjEuIDIsMDg4LDE0MiBoYXZlIGJlZW4gcmVhY2hlZCB0aHJvdWdob3V0IHRoZSBmaXJzdCB0aHJlZSBxdWFydGVycyBvZiAyMDIxOyB0aGlzIGlzIDcxJSBvZiB0aGUgY2x1c3RlciBQSU47IGhvd2V2ZXIsIGFzIHdlIGNhbiBzZWUsIHRoZSByZXNwb25zZSBoYXMgYmVlbiBoZWF2aWx5IHNrZXdlZCB0b3dhcmRzIFlhbmdvbiBhbmQgUmFraGluZS4gDQoNCg0KIyMjIDEuMiBCZW5lZmljaWFyaWVzIGFuZCBQSU4gYnkgc3RhdGUgYW5kIHJlZ2lvbiANCg0KYGBge3J9DQpwaW4gJT4lIA0KICBsZWZ0X2pvaW4oYmVuICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSkgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcmllcyA9IGlmZWxzZShpcy5uYShiZW5lZmljaWFyaWVzKSwgMCwgYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgUElOID0gc3VtKHRvdGFsX3BpbikpICU+JSANCiAgbXV0YXRlKGAlX29mX2JlbmAgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIGAlX29mX1BJTmAgPSByb3VuZChQSU4gLyBzdW0oUElOKSAqIDEwMCwgZGlnaXRzID0gMiksDQogICAgICAgICBgJV9QSU5fcmVhY2hlZGAgPSBpZmVsc2UoaXMuaW5maW5pdGUoYmVuZWZpY2lhcmllcyAvIFBJTiAqIDEwMCksIE5BX3JlYWxfLCBiZW5lZmljaWFyaWVzIC8gUElOICogMTAwKSwNCiAgICAgICAgIGAlX1BJTl9yZWFjaGVkYCA9IHJvdW5kKGAlX1BJTl9yZWFjaGVkYCwgZGlnaXRzID0gMikpICAlPiUgDQogIHJlbG9jYXRlKGAlX29mX2JlbmAsIC5hZnRlciA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgYXJyYW5nZShkZXNjKGAlX1BJTl9yZWFjaGVkYCkpICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIGFuZCBQSU4gYnkgc3RhdGUvcmVnaW9uIikNCg0KYGBgDQoNCkluIGdlbmVyYWwsIHRoZXJlIGlzIGxhcmdlIG1pc21hdGNoIGJldHdlZW4gYSBzdGF0ZSdzIHNoYXJlIG9mIGJlbmVmaWNpYXJpZXMgYW5kIGl0cyBzaGFyZSBvZiB0aGUgUElOIC0tIG5vdGFibHksIFlhbmdvbiBjb25zdGl0dXRlcyA2MSUgb2YgYWxsIGJlbmVmaWNpYXJpZXMgYnV0IG9ubHkgMTUlIG9mIHRoZSBuYXRpb253aWRlIFBJTi4gQWx0aG91Z2ggWWFuZ29uIGhhcyB0aGUgaGlnaGVzdCBzaGFyZSBvZiBwZW9wbGUgaW4gbmVlZCwgaXQgc2hvdWxkIGFsc28gYmUgc3RyZXNzZWQgdGhhdCB0aGUgcGVyY2VudGFnZSBvZiBpdCdzIHBvcHVsYXRpb24gdGhhdCBpcyB2dWxuZXJhYmxlIC0tIHRoYXQgaXMsIGVpdGhlciBmb29kIGluc2VjdXJlIG9yIGludGVybmFsbHkgZGlzcGxhY2VkIC0tIGlzIG9uZSBvZiB0aGUgbG93ZXN0IGluIHRoZSBjb3VudHJ5LCBhdCAyMiUsIHdpdGggb25seSBNYWd3YXksIFNhZ2FpbmcgYW5kIE1hbmRhbGF5IGhhdmluZyBsb3dlciBwZXJjZW50YWdlczogDQoNCmBgYHtyfQ0KcGluICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgZmlsdGVyKHN0YXRlICE9ICJOYXkgUHlpIFRhdyIpICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsX3BpbiA9IHJvdW5kKHN1bSh0b3RhbF9waW4pKSwNCiAgICAgICAgICAgIHRvdGFsX3BvcCA9IHN1bSh0b3RhbF9wb3ApKSAlPiUgDQogIG11dGF0ZShgdnVsbmVyYWJsZSVgID0gcm91bmQodG90YWxfcGluIC8gdG90YWxfcG9wICogMTAwLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIHN0YXRlID0gcmVvcmRlcihzdGF0ZSwgLWB2dWxuZXJhYmxlJWApKSAgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBzdGF0ZSwgeSA9IHRvdGFsX3BpbiwgZmlsbCA9IGB2dWxuZXJhYmxlJWApKSArDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gYHZ1bG5lcmFibGUlYCksIHNpemUgPSAyLjUsIHZqdXN0ID0gLTAuNSkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDcwLCB2anVzdCA9IDAuNSwgaGp1c3QgPSAwLjYpKSArDQogIGxhYnMoeCA9ICIiLA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIHBlb3BsZSBpbiBuZWVkIiwgDQogICAgICAgdGl0bGUgPSAiUElOIGFuZCBpbmNpZGVuY2Ugb2YgdnVsbmVyYWJpbHR5IGJ5IHN0YXRlIGFuZCByZWdpb24iLA0KICAgICAgIHN1YnRpdGxlID0gIlZ1bG5lcmFiaWxpdHkgaXMgZGVmaW5lZCBoZXJlIGFzIHRoZSBwcm9wb3J0aW9uIG9mIGEgcG9wdWxhdGlvbiB3aG8gYXJlIGZvb2QgaW5zZWN1cmUgb3IgYXJlIElEUHMiKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAwMDAwMCwgYnkgPSAyMDAwMDApLCBsYWJlbHMgPSBjb21tYSkgKw0KICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHJhbnMgPSAicmV2ZXJzZSIpDQpgYGANCg0KVnVsbmVyYWJpbGl0eSBoZXJlIGhhcyBiZWVuIGRlZmluZWQgYXMgdGhlIHByb3BvcnRpb24gb2YgdGhlIHBvcHVsYXRpb24gd2hvIGFyZSANCg0KIyMjIDEuMyBUb3duc2hpcC1sZXZlbA0KDQpKdXN0IGFzIHRoZSByZXNwb25zZSBoYXMgYmVlbiB2ZXJ5IHNrZXdlZCBhdCB0aGUgc3RhdGUgYW5kIHJlZ2lvbiBsZXZlbCwgdGhlIHNhbWUgaXMgdHJ1ZSBhdCB0aGUgdG93bnNoaXAgbGV2ZWwuIFRoZXNlIDEwIHRvd25zaGlwcyBiZWxvdyBhcmUgd2hlcmUgODAlIG9mIGFsbCBiZW5lZmljaWFyaWVzIGhhdmUgYmVlbiByZWFjaGVkIGRlc3BpdGUgb25seSBjb25zdGl0dXRpbmcgMTUlIG9mIHRoZSBQSU4gLS0gaW4gcGFydGljdWxhciwgRGFnb24gTXlvdGhpdCAoU2Vpa2thbikgYW5kIEhsYWluZ3RoYXJ5YSBoYXZlIGJlbmVmaWNpYXJ5IGZpZ3VyZXMgdGhhdCBhcmUgNjMzJSBhbmQgNDMwJSBvZiB0aGVpciBQSU4gcmVzcGVjdGl2ZWx5LiBGb3IgcmVmZXJlbmNlLCB0aGUgbWVkaWFuIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIGluIG5lZWQgY292ZXJlZCBwZXIgdG93bnNoaXAgaW4gdGhlIGFyZWFzIHdlIHdvcmsgaW4gaXMgNyUuICANCg0KDQpgYGB7cn0NCmJlbiAlPiUgDQogIGdyb3VwX2J5KHRvd25zaGlwKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSAlPiUgDQogIGxlZnRfam9pbihwaW4gJT4lIHNlbGVjdCh0b3duc2hpcCwgcGluID0gdG90YWxfcGluKSwgYnkgPSAidG93bnNoaXAiKSAlPiUgDQogIG11dGF0ZShwY19vZl90b3RhbCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgcGNfb2ZfcGluID0gcm91bmQocGluIC8gc3VtKHBpbiwgbmEucm0gPSBUUlVFKSAqIDEwMCwgZGlnaXRzID0gMiksDQogICAgICAgICBwY19yZWFjaGVkID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHBpbiAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgcmVsb2NhdGUocGNfb2ZfdG90YWwsIC5hZnRlciA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgcmVsb2NhdGUocGFydG5lcnMsIC5hZnRlciA9IHBjX3JlYWNoZWQpICU+JSANCiAgYXJyYW5nZShkZXNjKHBjX29mX3RvdGFsKSkgJT4lIA0KICBoZWFkKDEwKSAlPiUgDQogIHBhbmRlcihjYXB0aW9uID0gIlRvcCAxMCB0b3duc2hpcHMgYnkgYmVuZWZpY2lhcmllcyByZWFjaGVkIikNCg0KIA0KYGBgDQoNCmByIGJlbiAlPiUgc2VsZWN0KHRvd25zaGlwKSAlPiUgZGlzdGluY3QoKSAlPiUgbnJvdygpYCB0b3duc2hpcHMgaGF2ZSBiZWVuIHJlYWNoZWQgYnkgZm9vZCBzZWN1cml0eSBhY3Rpdml0aWVzIGluIHRoZSBmaXJzdCB0aHJlZS1xdWFydGVycyBvZiAyMDIxLiBUaGlzIGlzIGxlc3MgdGhhbiBhIHRoaXJkIG9mIHRoZSAzMzAgdG93bnNoaXBzIGluIHRoZSBjb3VudHJ5LiANCg0KIyMjIDEuNCBMb2NhdGlvbnMNCg0KUGFydG5lcnMgaGF2ZSByZXNwb25kZWQgaW4gYSB0b3RhbCBvZiBgciBiZW4gJT4lIHNlbGVjdChsb2NhdGlvbikgJT4lIGRpc3RpbmN0KCkgJT4lIG5yb3coKWBhY3Jvc3MgdGhlIGNvdW50cnksIHdpdGggdGhlIHZhc3QgbWFqb3JpdHkgb2YgbG9jYXRpb25zIG9ubHkgaGF2aW5nIG9ubHkgb25lIHBhcnRuZXIgb3BlcmF0aW5nIGluIHRoZW0uIE9mIHRoZSBgciBmc2MgJT4lIG5yb3coKWAgcm93cyByZXBvcnRlZCBpbiB0aGUgNVdzLCBvbmx5IGByIHN1bShpcy5uYShmc2MkbG9jYXRpb24pKWAgZGlkIG5vdCBoYXZlIGFueSBsb2NhdGlvbiByZXBvcnRlZC4gDQoNCkxvY2F0aW9ucyBhcmUgY2xhc3NpZmllZCBpbnRvIHRocmVlIGdyb3VwcyAtLSBjYW1wcywgaW5kdXN0cmlhbCB6b25lcyBhbmQgdmlsbGFnZXMvdG93bnMvd2FyZHM6IA0KDQpgYGB7cn0NCmJlbiAlPiUgDQogIGZpbHRlcighaXMubmEobG9jYXRpb24pKSAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uX3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGxvY2F0aW9ucyA9IG5fZGlzdGluY3QobG9jYXRpb24pLA0KICAgICAgICAgICAgdG93bnNoaXBzID0gbl9kaXN0aW5jdCh0b3duc2hpcCksDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShwY19vZl9iZW4gPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBhdmdfYmVuX3Blcl9sb2MgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gbG9jYXRpb25zLCBkaWdpdHMgPSAwKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiU3VtbWFyeSBvZiBsb2NhdGlvbiB0eXBlcyIpDQpgYGANCg0KVGhlIHZhc3QgbWFqb3JpdHkgb2YgbG9jYXRpb25zIGFyZSBzZXJ2ZWQgYnkgb25seSBvbmUgcGFydG5lci4gQmVsb3cgYXJlIGEgc2VyaWVzIG9mIGhpc3RvZ3JhbXMgc2hvd2luZyB0aGUgdmFyaWF0aW9uIGluIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyBieSBsb2NhdGlvbiwgc3BsaXQgYnkgbnVtYmVyIG9mIHBhcnRuZXJzIGluIGVhY2ggbG9jYXRpb246DQoNCmBgYHtyfQ0KDQpiZW4gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGxvY2F0aW9uKSkgJT4lIA0KICBncm91cF9ieShsb2NhdGlvbiwgdG93bnNoaXApICU+JSAgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhwYXJ0bmVycykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcykpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjEpICsNCiAgc2NhbGVfeF9sb2cxMCgpICsNCiAgZmFjZXRfd3JhcCh+IHBhcnRuZXJzKSArDQogIGxhYnMoeSA9ICJudW1iZXIgb2YgbG9jYXRpb25zIiwNCiAgICAgICB4ID0gImJlbmVmaWNpYXJpZXMgcGVyIGxvY2F0aW9uIiwgDQogICAgICAgdGl0bGUgPSAiSGlzdG9ncmFtcyBvZiBiZW5lZmljaWFyaWVzIGJ5IGxvY2F0aW9uIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJGYWNldGVkIGJ5IG51bWJlciBvZiBwYXJ0bmVycyBwZXIgbG9jYXRpb24iKQ0KDQpgYGANCg0KVGhlIG1vcmUgcGFydG5lcnMgb3BlcmF0aW5nIGluIGEgZ2l2ZW4gbG9jYXRpb24sIHRoZSBoaWdoZXIgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXM7IGhvd2V2ZXIsIGl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoZXNlIG11bHRpLXNlY3RvciBsb2NhdGlvbnMgYXJlIGNvbXBhcmF0aXZlbHkgcmFyZToNCg0KYGBge3J9DQpiZW4gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGxvY2F0aW9uKSkgJT4lIA0KICBncm91cF9ieShsb2NhdGlvbiwgdG93bnNoaXApICU+JSAgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSAlPiUgDQogIGdyb3VwX2J5KHBhcnRuZXJzKSAlPiUgDQogIHN1bW1hcmlzZShsb2NhdGlvbnMgPSBzdW0obl9kaXN0aW5jdChsb2NhdGlvbikpLA0KICAgICAgICAgICAgYXZnX2JlbmVmaWNpYXJpZXMgPSBtZWRpYW4oYmVuZWZpY2lhcmllcykpICU+JQ0KICBtdXRhdGUocGFydG5lcnMgPSByZWNvZGUocGFydG5lcnMsIGAxYCA9ICJvbmVfcGFydG5lciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBgMmAgPSAidHdvX3BhcnRuZXJzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGAzYCA9ICJ0aHJlZV9wYXJ0bmVycyIpKSAlPiUgDQogcGFuZGVyKCkNCg0KYGBgDQoNCiMjIDIuIEFjdGl2aXRpZXMgYW5kIG1vZGFsaXRpZXMNCg0KIyMjIDIuMSBQcm9ncmVzcyBieSBhY3Rpdml0eQ0KDQpgYGB7cn0NCmJlbiAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5KSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoY3VtX2JlbiA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICAgbXV0YXRlKGFjdGl2aXR5ID0gc3Vic3RyKGFjdGl2aXR5LCAwLCA1NSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGN1bV9iZW4sIGNvbG91ciA9IGFjdGl2aXR5KSkgKw0KICBnZW9tX2xpbmUoKSArDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwgZGF0ZV9sYWJlbHMgPSAiJWIiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBmYWNldF93cmFwKH4gYWN0aXZpdHksIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJjdW11bGF0aXZlIGJlbmVmaWNpYXJpZXMiLCANCiAgICAgICB0aXRsZSA9ICJNb250aGx5IHByb2dyZXNzIGJ5IGFjdGl2aXR5LCAyMDIxIFExLVEzIikgKyANCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKQ0KYGBgDQoNClBhcnRuZXJzIHJlcG9ydGVkIHRoZWlyIGFjaGlldmVtZW50cyBhY3Jvc3MgOCA1VyBhY3Rpdml0aWVzLiBJdCBpcyBpbnRlcmVzdGluZyB0byBub3RlIHRoYXQgYWxtb3N0IGFsbCB0aGUgYmVuZWZpY2lhcmllcyBtb250aGx5IGNhc2ggdHJhbnNmZXJzIHdlcmUgZXN0YWJsaXNoZWQgdmVyeSBlYXJseSBvbiAob3IgaGFkIGJlZW4gZXN0YWJsaXNoZWQgcHJpb3IgdG8gMjAyMSksIHdpdGggbmV3IGJlbmVmaWNpYXJpZXMgYmVpbmcgYWRkZWQgdmVyeSBpbmNyZW1lbnRhbGx5IHRocm91Z2hvdXQgdGhlIHllYXIuIFRoaXMgc3BlYWtzIHRvIG9uZSBvZiB0aGUgZGlmZmljdWx0aWVzIG9mIGludGVycHJldGluZyB0aGlzIGRhdGEgLS0gdGhhdCB0aGVzZSBwYXR0ZXJucyBhcmUgbW9yZSByZWZsZWN0aXZlIG9mIHBhcnRuZXJzJyByZXBvcnRpbmcgYmVoYXZpb3VycyByYXRoZXIgdGhhbiB0aGV5IGFyZSBvZiBjaGFuZ2VzIGluIHRoZSBmaWVsZC4gRm9yIGluc3RhbmNlIC0tIHdhcyB0aGVyZSB0cnVseSBhIG1hc3NpdmUgbGVhcCBpbiB0ZWNoaWNhbCB0cmFpbmluZyBpbiBTZXB0ZW1iZXIsIG9yIGRpZCBhIHBhcnRuZXIgcmVwb3J0IGFsbCB0aGVpciBhY2hpZXZlbWVudHMgYXQgb25jZT8gTmV2ZXJ0aGVsZXNzLCB0aGlzIHNlY3Rpb24gd2lsbCBleHBsb3JlIHRoZSBkYXRhIGFzIGl0IGV4aXN0cyB0byB1bmRlcnN0YW5kIHdoYXQgbWVhbmluZ2Z1bCBhbmFseXNpcyBjYW4gYmUgZHJhd24gZnJvbSBpdC4gDQoNCiMjIyAyLjEgRGVsaXZlcnkgbW9kYWxpbHRpZXMgDQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiICYgIWlzLm5hKGRlbGl2ZXJ5X21vZGFsaXR5KSkgJT4lIA0KICBncm91cF9ieShkZWxpdmVyeV9tb2RhbGl0eSwgYWN0aXZpdHkpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JQ0KICBtdXRhdGUoYWN0aXZpdHkgPSBzdWJzdHIoYWN0aXZpdHksIDAsIDcyKSwNCiAgICAgICAgIGRlbGl2ZXJ5X21vZGFsaXR5ID0gcmVjb2RlKGRlbGl2ZXJ5X21vZGFsaXR5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIeWJyaWQgKEluLWtpbmQgJiBDYXNoKSIgPSAiSHlicmlkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlIGRlbGl2ZXJ5L3N1cHBvcnQiID0gIlNlcnZpY2VzL3N1cHBvcnQiKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkZWxpdmVyeV9tb2RhbGl0eSwgeSA9IGJlbmVmaWNpYXJpZXMsIGZpbGwgPSBhY3Rpdml0eSkpICsNCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBsYWJzKHggPSAiIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQwLCBoanVzdCA9IDAuNSwgdmp1c3QgPSAwLjUpKSArDQogIGZhY2V0X3dyYXAofiBhY3Rpdml0eSwgc2NhbGVzID0gImZyZWVfeSIpDQogIA0KYGBgDQoNCkNhc2ggaXMgdGhlIHByZWZlcnJlZCBkZWxpdmVyeSBtb2RhbGl0eSBmb3IgZm91ciBvdXQgb2YgdGhlIG5pbmUgYWN0aXZpdGllcyB1bmRlciB0aGUgRm9vZCBTZWN1cml0eSBDbHVzdGVyLCBmb2xsb3dlZCBieSAiaW4ta2luZCIsIHdoaWNoIGlzIHRoZSBwcmVmZXJyZWQgbW9kYWxpdHkgaW4gdGhyZWUuIEhvd2V2ZXIsIHRoZSBpbi1raW5kIG1vZGFsaXR5IGhhcyB0aGUgaGlnaGVzdCByZWFjaCwgZ2l2ZW4gdGhlIGVzcGVjaWFsbHkgbGFyZ2UgYmVuZWZpY2lhcnkgbnVtYmVycyBvcmlnaW5hdGluZyBmcm9tIHRoZSBwcm92aXNpb24gb2YgbW9udGhseSBmb29kIGJhc2tldHMuIA0KDQpJdCBtdXN0IGJlIG5vdGVkLCBob3dldmVyLCB0aGF0IGEga2V5IHBpZWNlIG9mIG1pc3NpbmcgaW5mb3JtYXRpb24gbm90IGN1cnJlbnRseSBjYXB0dXJlZCBieSB0aGUgNVcgdGVtcGxhdGUgaXMgdGhlIGR1cmF0aW9uIG9mIHRoZXNlIGFjdGl2aXRpZXMgLS0gdGhlIG51bWJlciBvZiBtb250aHMgYSBtb250aGx5IGZvb2QgYmFza2V0IGlzIHByb3ZpZGVkIGNhbm5vdCBiZSByZWxpYWJseSBjYWxjdWxhdGVkIGZyb20gdGhlIGRhdGEgd2UgY3VycmVudGx5IGhhdmUgb24gaGFuZC4gV2UgYWxzbyBub3RlIHNldmVyYWwgbWlzY2xhc3NpZmljYXRpb25zIC0tIHNtYWxsIHBvcnRpb25zIG9mIG1vbnRobHkgY2FzaCB0cmFuc2ZlcnMgaGF2ZSBiZWVuIGNvZGVkIGFzIGluLWtpbmQgYW5kIHRoZXJlIGFyZSBpbi1raW5kIGZvb2QgYmFza2V0cyBjb2RlZCBhcyBoeWJyaWQuIEl0IG1pZ2h0IGFsc28gYmUgd29ydGggY29uc2lkZXJpbmcgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gInN1cHBvcnQgZm9yIGluY29tZS1nZW5lcmF0aW5nIGFjdGl2aXRpZXMiIGFuZCB0aGUgInByb3Zpc2lvbiBvZiB0ZWNobmljYWwgdHJhaW5pbmciIGFzIHNlcnZpY2UgZGVsaXZlcnkgYW5kIHN1cHBvcnQgYXJlIGhlYXZpbHkgcHJlc2VudCBpbiBib3RoLiANCg0KYGBge3J9DQpmc2MgJT4lIA0KICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZ3JvdXBfYnkoZGVsaXZlcnlfbW9kYWxpdHksIGZyZXF1ZW5jeSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBmaWx0ZXIoYmVuZWZpY2lhcmllcyA+IDApICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGZyZXF1ZW5jeSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIGFkb3JuX3RvdGFscygiY29sIiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShwY19vZl9Ub3RhbCA9IHJvdW5kKFRvdGFsIC8gMjA4ODE0MiAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKFRvdGFsKSkgJT4lIA0KICBhZG9ybl90b3RhbHMoInJvdyIsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBwYW5kZXIoY2FwdGlvbiA9ICJEZWxpdmVyeSBtb2RhbGl0aWVzIGJ5IGZyZXF1ZW5jeSIpDQoNCmBgYA0KDQpJbi1raW5kIHN1cHBvcnQgd2FzIGJ5IGZhciB0aGUgbW9zdCBjb21tb24gZGVsaXZlcnkgbW9kYWxpdHksIHdpdGggODUlIG9mIHVuaXF1ZSBiZW5lZmljaWFyaWVzIHJlY2VpdmluZyBzdXBwb3J0IHRocm91Z2ggdGhhdCBtZWFucy4gMTMlIG9mIGJlbmVmaWNpYXJpZXMgd2VyZSByZWFjaGVkIGJ5IGNhc2ggdHJhbnNmZXJzLiBJIGJlbGlldmUgdGhlICJvdGhlciIgZnJlcXVlbmN5IHNob3VsZCBiZSBkcm9wcGVkIGFzIGFuIG9wdGlvbiBpbiB0aGUgNVcgdGVtcGxhdGUgYW5kIHJlcGxhY2VkIHdpdGggbW9yZSBzcGVjaWZpYyBvcHRpb25zIGFzIGl0IGlzIHVuY2xlYXIgaWYgaXQgcmVmZXJzIHRvIGludGVydmVudGlvbnMgdGhhdCByZXBlYXQgbW9yZSBmcmVxdWVudGx5IHRoYW4gb25jZSBhIG1vbnRoIG9yIGxlc3MuIEl0IG1pZ2h0IGFsc28gYmUgdGhhdCBwYXJ0bmVycyBhcmUgc2VsZWN0aW5nICJvdGhlciIgaW5zdGVhZCBvZiBsZWF2aW5nIHRoZSBmaWVsZCBibGFuay4gSXQgbWlnaHQgYmUgcG9zc2libGUgdG8gYmFja2ZpbGwgbW9zdCB0aGUgdGhlICJvdGhlciIgdmFsdWVzIGZyb20gdGhlIGBiZW5lZmljaWFyaWVzX3JlY3VycmVuY3lgIGNvbHVtbiAtLSB0aGlzIHdpbGwgYmUgZXhwbG9yZSBmdXJ0aGVyIGluIHRoZSBzZWN0aW9uIG9uIGJlbmVmaWNpYXJpZXMuIA0KDQojIyMgMi4yIFZhbHVlIG9mIGludGVydmVudGlvbiBwYWNrYWdlcyBwZXIgaG91c2Vob2xkIA0KDQpgYGB7cn0NCmZzYyAlPiUgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIiAmICFpcy5uYSh1c2RfaGhkX2JpbikpICU+JQ0KICBncm91cF9ieSh1c2RfaGhkX2JpbikgJT4lICANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gdXNkX2hoZF9iaW4sIHkgPSBiZW5lZmljaWFyaWVzKSkgKw0KICBnZW9tX2NvbCgpICsNCiAgbGFicyh4ID0gIlVTRCB2YWx1ZSBvZiBjYXNoIHRyYW5zZmVyIHBlciBob3VzZWhvbGQiLA0KICAgICAgIHkgPSAiQmVuZWZpY2lhcmllcyIsDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcGVyIHZhbHVlIG9mIGNhc2ggdHJhbnNmZXIgdmFsdWUgcGVyIGhvdXNlaG9sZCIpDQpgYGANCg0KV2Ugbm90ZSB0aGF0IHRoZSBtb3N0IGNvbW1vbiB0cmFuc2ZlciB2YWx1ZXMgLS0gaW4gdGVybXMgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIC0tIGFyZSBiZXR3ZWVuIFVTRCAxMCBhbmQgVVNEIDIwLCB0aG91Z2ggaXQgc2hvdWxkIGJlIG5vdGVkIC0tIGFuZCBjYW4gYmUgbW9yZSBjbGVhcmx5IHNlZW4gZnJvbSB0aGUgdGFibGUgYmVsb3csIGEgbm90IGluc2lnbmlmY2FudCBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyB3ZXJlIHJlYWNoZWQgYnkgY2FzaCB0cmFuc2ZlciBpbnRlcnZlbnRpb25zIHZhbHVlZCBhdCBtb3JlIHRoYW4gVVNEIDEwMCBwZXIgaG91c2Vob2xkLiANCg0KYGBge3J9DQpmc2MgJT4lICANCiAgZmlsdGVyKCFpcy5uYSh1c2RfaGhkX2JpbikgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICBmaWx0ZXIoZGVsaXZlcnlfbW9kYWxpdHkgJWluJSBjKCJDYXNoIiwgIkh5YnJpZCAoSW4ta2luZCAmIENhc2gpIiwgIlZvdWNoZXIiKSkgJT4lIA0KICBjb3VudCh1c2RfaGhkX2JpbixmcmVxdWVuY3ksIHd0ID0gYmVuZWZpY2lhcmllcykgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBmcmVxdWVuY3ksIHZhbHVlc19mcm9tID0gbikgJT4lIA0KICByZW5hbWUodHJhbnNmZXJfdmFsdWUgPSB1c2RfaGhkX2JpbikgJT4lDQogIHJlbG9jYXRlKEZpcnN0LCAuYWZ0ZXIgPSB0cmFuc2Zlcl92YWx1ZSkgJT4lIA0KICBzZWxlY3QoLWBOQWApICU+JSANCiAgYWRvcm5fdG90YWxzKCJjb2wiLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKHBjX29mX1RvdGFsID0gcm91bmQoVG90YWwgLyBzdW0oVG90YWwpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBwYW5kZXIoY2FwdGlvbiA9ICJDYXNoIHRyYW5zZmVyLCBoeWJyaWQgYW5kIHZvdWNoZXIgdmFsdWVzIHBlciBob3VzZWhvbGQgYnkgZnJlcXVlbmN5IG9mIHRyYW5zZmVyIChVU0QpIikgICANCmBgYA0KDQpOZXh0LCBsZXQgdXMgdGFrZSBhIGxvb2sgYXQgaG91c2Vob2xkIHBhY2thZ2UgdmFsdWVzIGJ5IGFjdGl2aXR5IHR5cGU6DQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYSh1c2RfaGhkX2JpbikgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lDQogIGdyb3VwX2J5KGFjdGl2aXR5LCB1c2RfaGhkX2JpbikgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUoYWN0aXZpdHkgPSBzdWJzdHIoYWN0aXZpdHksIDAsIDcyKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSB1c2RfaGhkX2JpbiwgeSA9IGJlbmVmaWNpYXJpZXMsIGZpbGwgPSBhY3Rpdml0eSkpICsNCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBsYWJzKHggPSAiIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgZmFjZXRfd3JhcCh+IGFjdGl2aXR5LCBzY2FsZXMgPSAiZnJlZV95IikgKyANCiAgbGFicyh0aXRsZSA9ICJWYXJpYXRpb24gaW4gdGhlICBwZXIgaG91c2Vob2xkIHZhbHVlcyBvZiBpbnRlcnZlbnRpb24gcGFja2FnZXMgaW4gVVNEIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJGYWNldGVkIGJ5IGFjdGl2aXR5IikNCg0KYGBgDQoNCkFuIGF2ZW51ZSB0byBleHBsb3JlIGhlcmUgd291bGQgYmUgdGhlIHByb3Zpc2lvbiBvZiBtb250aGx5IGNhc2ggdHJhbnNmZXJzIC0tIHRoaXMgYWN0aXZpdHkgaGFzIGEgdmVyeSBjbGVhciBwZWFrIGF0IGAkMTAtJDIwYC4gQSBjbG9zZXIgbG9vayBhdCB0aGUgZGF0YSByZXZlYWxzIHRoaXMgYWxtb3N0IGVudGlyZWx5IGR1ZSAxMjIsODU0IGJlbmVmaWNpYXJpZXMgd2hvIHJlY2VpdmVkIG1vbnRobHkgdHJhbnNmZXJzIG9mIFVTRCAxMC41MCBwZXIgaG91c2Vob2xkOyBpdCBpcyB1bmNsZWFyIHdoZXRoZXIgVVNEIDEwLjUwIHBlciBob3VzZWhvbGQgd291bGQgYmUgc3VmZmljaWVudCB0byBjb3ZlciB0aGVpciBtb250aGx5IGZvb2QgbmVlZHMgLS0gd2Ugc2hvdWxkIGNyb3NzLXJlZmVyZW5jZSB0aGlzIHdpdGggdGhlIGNhbGN1bGF0aW9ucyBmb3IgbWluaW11bSBleHBlbmRpdHVyZSBiYXNrZXRzIC0tIGJ1dCBpdCBjZXJ0YWlubHkgaXMgZG91YnRmdWwuIFBlcmhhcHMgdGhpcyB0eXBlIG9mIHJlbGF0aXZlbHkgbG93LXZhbHVlIHRyYW5zZmVyIHNob3VsZCBiZSByZWNsYXNzaWZpZWQgYXMgYSBzdXBwbGVtZW50YXJ5IGludGVydmVudGlvbiBub3QgbWVhbnQgdG8gY292ZXIgYSBob3VzZWhvbGQgZm9vZCBzZWN1cml0eSBuZWVkcy4gNyBwYXJ0bmVycyBjdXJyZW50bHkgcHJvdmlkZSB0aGlzIHR5cGUgb2YgbW9udGhseSB0cmFuc2ZlciAtLSBTYXZlIHRoZSBDaGlsZHJlbiwgV0ZQLCBNeWFubWFyIEhlYXJ0IE9yZ2FuaXNhdGlvbiwgUGVvcGxlIGZvciBQZW9wbGUsIFBsYW4gSW50ZXJuYXRpb25hbCwgV29ybGQgVmlzaW9uIE15YW5tYXIgYW5kIEthcnVuYSBNaXNzaW9uIFNvY2lhbCBTb2xpZGFyaXR5OyB3ZSBzaG91bGQgZm9sbG93IHVwIHdpdGggdGhlbSB0byB1bmRlcnN0YW5kIGlmIHRoaXMgc3VtIChlcXVpdmFsZW50IHRvIE1NSyAxNSwwMDApIGlzIHRydWx5IG1lYW50IHRvIGNvdmVyIG1vbnRobHkgZm9vZCBleHBlbmRpdHVyZXMuIA0KDQpUaGUgdHdvIHBlYWtzIGluICJzdXBwb3J0IGZvciBpbmNvbWUtZ2VuZXJhdGluZyBhY3Rpdml0aWVzIiAoYCQxMC0kMjBgIGFuZCBgYWJvdmVfJDIwMGApIGFyZSBhbiBvcmRlciBvZiBtYWduaXR1ZGUgYXBhcnQgLS0gaXQgbm90IGluY29uY2VpdmFibGUgdGhhdCB0aGV5IHNob3VsZCBiZSBzcGxpdCBpbnRvIHR3byBzZXBhcmF0ZSBhY3Rpdml0aWVzLiANCg0KU29tZSBwYXJ0bmVycyBoYXZlIGFsc28gcmVwb3J0ZWQgdGhlIHZhbHVlIG9mIHRoZSBmb29kIGJhc2tldHMgdGhleSBhcmUgZGlzdHJpYnV0ZWQ7IGhvd2V2ZXIsIHRoZXNlIG9ubHkgcmVwcmVzZW50IGEgc21hbGwgZnJhY3Rpb24gb2YgdGhlIHRvdGFsIChsZXNzIHRoYW4gMSUsIGJ5IGJlbmVmaWNpYXJpZXMpIGFuZCBpdCB3b3VsZCBiZSBtdWNoIG1vcmUgcHJlZmVyYWJsZSB0byBjb2xsZWN0IHRoZSBhY3R1YWwgY29udGVudHMgb2YgdGhlc2UgZm9vZCBiYXNrZXRzIGZvciBhbmFseXNpcyB0aGFuIHVzZSB0aGUgZGF0YSBpbiB0aGUgNVdzLiANCg0KDQojIyAzLiBQYXJ0bmVycw0KDQpQYXJ0bmVycyBmYWlybHkgZXZlbmx5IHNwbGl0IHRoZW1zZWx2ZXMgYmV0d2VlbiBIUlAgaW5kaWNhdG9ycywgd2l0aCAyOSBjb250cmlidXRpbmcgdG93YXJkcyBmb29kIGFuZCBjYXNoIGFzc2lzdGFuY2UgYW5kIDI4IGNvbnRyaWJ1dGluZyB0b3dhcmRzIGFncmljdWx0dXJlIGFuZCBvdGhlciBsaXZlbGlob29kIHN1cHBvcnQuIEFzIGEgcmVmZXJlbmNlLCAyOCBwYXJ0bmVycyBoYXZlIHJlYWNoZWQgbGVzcyB0aGFuIDEwLDAwMCB1bmlxdWUgYmVuZWZpY2lhcmllcyBhbmQgdGhlIG1lZGlhbiB1bmlxdWUgYmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IHBhcnRuZXJzIGlzIDQsNjk3LiBCZWxvdyBhcmUgdGhlIHRvcCAxMCBwYXJ0bmVycyBieSBIUlAgaW5kaWNhdG9yLiANCg0KYGBge3J9DQoNCmNiaW5kKA0KICANCiAgYmVuICU+JSANCiAgICBmaWx0ZXIoaHJwX2luZGljYXRvciA9PSAiMS4gTnVtYmVyIG9mIHBlb3BsZSB3aG8gcmVjZWl2ZWQgZm9vZCBhbmQvb3IgY2FzaCBhc3Npc3RhbmNlIikgJT4lIA0KICAgIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIA0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgcmVuYW1lKGAxLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBmb29kIGFuZC9vciBjYXNoIGFzc2lzdGFuY2VgID0gYmVuZWZpY2lhcmllcywNCiAgICAgICAgICAgYFBhcnRuZXJzIEhSUCBpbmRpY2F0b3IgMWAgPSBpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSANCiAgICBoZWFkKDEwKSwNCiAgDQogIGJlbiAlPiUgDQogICAgZmlsdGVyKGhycF9pbmRpY2F0b3IgPT0gIjIuIE51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGFncmljdWx0dXJlIGFuZCBvdGhlciBsaXZlbGlob29kIHN1cHBvcnQiKSAlPiUgDQogICAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgICByZW5hbWUoYDIuIE51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGFncmljdWx0dXJlIGFuZCBvdGhlciBsaXZlbGlob29kIHN1cHBvcnRgID0gYmVuZWZpY2lhcmllcywNCiAgICAgICAgICAgYFBhcnRuZXJzIEhSUCBpbmRpY2F0b3IgMmAgPSBpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSANCiAgICBoZWFkKDEwKQ0KICANCikgJT4lIA0KICBhZGRfY29sdW1uKGAgYCA9ICIgIikgJT4lIA0KICByZWxvY2F0ZShgIGAsIC5hZnRlciA9IGAxLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBmb29kIGFuZC9vciBjYXNoIGFzc2lzdGFuY2VgKSAlPiUgDQogIHBhbmRlcihjYXB0aW9uID0gIlRvcCAxMCBwYXJ0bmVycyBieSBiZW5lZmljaWFyaWVzIHJlYWNoZWQsIGJ5IEhSUCBpbmRpY2F0b3IiKQ0KDQpgYGANCg0KIyMjIERpc3RyaWJ1dGlvbiBvZiBwYXJ0bmVycyBieSBiZW5lZmljaWFyaWVzIGFuZCBnZW9ncmFwaGljIHJlYWNoIA0KX21vdXNlIG92ZXIgZm9yIGRldGFpbHNfDQoNCldoaWxzdCB0aGVyZSBpcyBxdWl0ZSBhIGJpdCBvZiB2YXJpYXRpb24gaW4gdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQsIHdlIGNhbiBzZWUgdGhhdCBwYXJ0bmVycycgZ2VvZ3JhcGhpYyBmb290cHJpbnRzIGFyZSAtLSBvbiB0aGUgd2hvbGUgLS0gcXVpdGUgbGltaXRlZC4gT25seSA0IG91dCBvZiA0NyBwYXJ0bmVycyBoYXZlIGEgcHJlc2VuY2UgaW4gbW9yZSB0aGFuIDEwIHRvd25zaGlwcywgd2l0aCBvbmx5IDEwIGJlaW5nIHByZXNlbnQgaW4gbW9yZSB0aGFuIDUuIDc5JSBvZiBvdXIgcGFydG5lcnMgKGNsdXN0ZXJlZCBhbG9uZyB0aGUgYm90dG9tIG9mIHRoZSBjaGFydCkgYXJlIHByZXNlbnQgaW4gNSBvciBsZXNzIHRvd25zaGlwcy4gSWYgdGhlIHJlc3BvbnNlIGlzIHRydWx5IG1lYW50IHRvIGJlIGNvdW50cnl3aWRlLCBpdCBpcyBpbXBlcmF0aXZlIHRvIHVuZGVyc3RhbmQgd2hhdCB3b3VsZCBpbmNlbnRpdmlzZSBwYXJ0bmVycyB0byBleHBhbmQgdGhlaXIgZm9vdHByaW50cy4NCg0KYGBge3J9DQpwYXJ0bmVyX3NjYXR0ZXIgPC0gYmVuICU+JSANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogIHN1bW1hcmlzZShzdGF0ZXMgPSBuX2Rpc3RpbmN0KGFkbWluMV9wY29kZSksDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSksDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhzdGF0ZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSB0b3duc2hpcHMsIHRleHQgPSBpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSArICANCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IGJlbmVmaWNpYXJpZXMpKSArDQogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2ciLCBsYWJlbHMgPSBjb21tYSwgYnJlYWtzID0gYygwLCAxMDAsIDEwMDAsIDEwMDAwLCAxMDAwMDAsIDMwMDAwMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAzMCwgNSkpICsNCiAgbGFicyh4ID0gIk51bWJlciBvZiBiZW5lZmljaWFyaWVzIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiB0b3duc2hpcHMiLA0KICAgICAgIHRpdGxlID0gIlBsb3Qgb2YgYmVuZWZpY2lhcmllcyBhbmQgdG93bnNoaXBzIHJlYWNoZWQsIGJ5IGltcGxlbWVudGluZyBwYXJ0bmVyIikgDQojIGZvciBzb21lIHJlYXNvbiwgcmVtb3ZpbmcgdGhpcyBtZXNzZXMgd2l0aCB0aGUgYWxpZ25tZW50IG9mIHRoZSBwbG90DQoNCmdncGxvdGx5KHBhcnRuZXJfc2NhdHRlcikgJT4lDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiUGxvdCBvZiBiZW5lZmljaWFyaWVzIGFuZCB0b3duc2hpcHMgcmVhY2hlZCwgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VwPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW91c2Ugb3ZlciBmb3IgZGV0YWlscyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9zdXA+IikpKQ0KICANCmBgYA0KDQojIyMgTWFwIG9mIG51bWJlciBvZiBwYXJ0bmVycyBhbmQgcGVvcGxlIGluIG5lZWQgYnkgc3RhdGUvcmVnaW9uDQoNCmBgYHtyfQ0KDQpiZW4gJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVycykpICU+JSANCiAgcmlnaHRfam9pbihwY29kZTFfc2hhcGUsIGJ5ID0gInN0YXRlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gcGFydG5lcnMpLCBzaXplID0gMC4xKSArDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBwYXJ0bmVycyksIHNpemUgPSAyKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQodHJhbnMgPSAicmV2ZXJzZSIpICsNCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAzKSwNCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjMsICdjbScpKSArDQoNCnBpbiAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIHN1bW1hcmlzZShQSU4gPSBzdW0odG90YWxfcGluKSkgJT4lIA0KICBtdXRhdGUoUElOID0gcm91bmQoUElOLCBkaWdpdHMgPSAwKSwgDQogICAgICAgICBQSU4gPSByZWNvZGUoUElOLCANCiAgICAgICAgICAgICAgICAgICAgICAnMCcgPSBOQV9yZWFsXykpICU+JQ0KICByaWdodF9qb2luKHBjb2RlMV9zaGFwZSwgYnkgPSAic3RhdGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBQSU4pLCBzaXplID0gMC4xKSArDQogIGdlb21fc2ZfdGV4dF9yZXBlbChhZXMobGFiZWwgPSBzY2FsZXM6OmNvbW1hKFBJTikpLCBzaXplID0gMS41KSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQodHJhbnMgPSAicmV2ZXJzZSIpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMpLA0KICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuMywgJ2NtJykpDQoNCg0KYGBgDQpUaGVyZSBhcmUgNTggY29tYmluYXRpb25zIGJldHdlZW4gcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbnMgYW5kIGltcGxlbWVudGluZyBwYXJ0bmVycywgMTkgb2Ygd2hpY2ggYXJlIGluc3RhbmNlcyB3aGVyZSB0aGUgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbiBhbmQgdGhlIGltcGxlbWVudGluZyBwYXJ0bmVyIGFuZCB0aGUgc2FtZSBvcmdhbmlzYXRpb247IG9uY2UgdGhlc2UgMTkgYXJlIGZpbHRlcmVkIG91dCwgYWxsIHRoZSByZW1haW5pbmcgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGNvcnJlc3BvbmQgdG8ganVzdCAxMCByZXBvcnRpbmcgb3JnYW5pc2F0aW9uczoNCg0KYGBge3J9DQpmc2MgJT4lIA0KICBmaWx0ZXIocmVwb3J0aW5nX29yZ2FuaXphdGlvbiAhPSBpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSANCiAgZ3JvdXBfYnkocmVwb3J0aW5nX29yZ2FuaXphdGlvbikgJT4lIA0KICBzdW1tYXJpc2UoaW1wbGVtZW50aW5nX3BhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSAlPiUgDQogIHBhbmRlcihjYXB0aW9uID0gJ051bWJlciBvZiBpbXBsZW1lbnRpbmcgcGFydG5lcnMgYnkgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbicpDQogIA0KYGBgDQpgYGB7cn0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyX3R5cGUpICU+JSAgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHRvd25zaGlwcyA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSkgJT4lIA0KICBwYW5kZXIoY2FwdGlvbiA9ICJCZW5lZmljaWFyaWVzIGJ5IGltcGxtZW50aW5nIHBhcnRuZXIgdHlwZSIpDQpgYGANCg0KDQoNCg0KDQpgYGB7cn0NCnZ1bG1tciAlPiUgDQogIHNlbGVjdChzdGF0ZSA9IHN0YXRlX3JlZ2lvbl9uYW1lLCBhZGp1c3RlZF9hcHByb3hpbWF0ZV92dWxuZXJhYmxlX3BvcHVsYXRpb24sIHRvdGFsX3BvcF9ib3RoX3NleGVzKSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgIA0KICBkcm9wX25hKCkgJT4lDQogIHN1bW1hcmlzZSh2dWxuZXJhYmxlX3BvcCA9IHN1bShhZGp1c3RlZF9hcHByb3hpbWF0ZV92dWxuZXJhYmxlX3BvcHVsYXRpb24pLCANCiAgICAgICAgICAgIHRvdGFsX3BvcCA9IHN1bSh0b3RhbF9wb3BfYm90aF9zZXhlcykpICU+JSANCiAgbXV0YXRlKHZ1bG5lcmFibGVfcGMgPSB2dWxuZXJhYmxlX3BvcCAvIHRvdGFsX3BvcCkgJT4lIA0KICBsZWZ0X2pvaW4oYmVuICU+JQ0KICAgICAgICAgICAgICBncm91cF9ieShzdGF0ZSkgJT4lDQogICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSwgYnkgPSAic3RhdGUiKSAlPiUgDQogIG11dGF0ZShiZW5lZmljaWFyaWVzID0gaWZlbHNlKCFpcy5uYShiZW5lZmljaWFyaWVzKSwgYmVuZWZpY2lhcmllcywgMCkpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHZ1bG5lcmFibGVfcG9wLCBiZW5lZmljaWFyaWVzKSwgbmFtZXNfdG8gPSAidHlwZSIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZmN0X3JlbGV2ZWwoc3RhdGUsIHNyX29yZCksIHkgPSB2YWx1ZSwgZmlsbCA9IHR5cGUpKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCB2anVzdCA9IDAuNSwgaGp1c3QgPSAwLjUpKSArDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBsYWJzKHggPSAiIiwNCiAgICAgICB5ID0gIiIsIA0KICAgICAgIHRpdGxlID0gIkZvb2Qgc2VjdXJpdHkgYmVuZWZpY2lhcmllcyAoNVdzKSBhbmQgdnVsbmVyYWJsZSBwb3B1bGF0aW9uIChNSU1VKSIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKQ0KYGBgDQoNCg0KIyMjIEJlbmVmaWNpYXJpZXMgDQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShiZW5lZmljaWFyeV90eXBlKSAmIHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlLCBiZW5lZmljaWFyeV90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gYmVuZWZpY2lhcnlfdHlwZSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIGFkb3JuX3RvdGFscyh3aGVyZSA9ICJyb3ciLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgYWRvcm5fcGVyY2VudGFnZXMoZGVub21pbmF0b3IgPSAicm93IiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGBIb3N0L2xvY2FsIENvbW11bml0eWAsIGBJbnRlcm5hbGx5IERpc3BsYWNlZGAsIGBSZXR1cm5lZXNgLCBgUmFraGluZSBzdGF0ZWxlc3NgKSwgDQogICAgICAgICAgICAuZnVucyA9IGxpc3QofiAuICogMTAwKSkgJT4lIA0KICBsZWZ0X2pvaW4oZnNjICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYShiZW5lZmljaWFyeV90eXBlKSAmIHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoc3RhdGUpICU+JQ0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSksIGJ5ID0gInN0YXRlIikgJT4lIA0KICBwYW5kZXIoY2FwdGlvbiA9ICJQZXJjZW50YWdlIG9mIGJlbmVmaWNpYXJpZXMgYnkgdHlwZSwgYnkgc3RhdGUvcmVnaW9uIikNCg0KYGBgDQoNClRoZSBzdGF0ZXMgYW5kIHN1Yi1yZWdpb25zIGluIHdoaWNoIHdlIGFyZSB3b3JraW5nIHRoZSBtb3N0IHdpdGggSURQcyBhcmUgQmFnbyAoRWFzdCksIEthY2hpbiwgQ2hpbiwgU2hhbiAoTm9ydGgpIGFuZCBLYXlhaC4gT3ZlcmFsbCwgNzUlIG9mIGJlbmVmaWNpYXJpZXMgYXJlIGZyb20gdGhlIGhvc3QvbG9jYWwgY29tbXVuaXR5LCAxNCUgYXJlIHN0YXRlbGVzcyBwZXJzb25zIGZyb20gUmFraGluZSBhbmQgMTElIGFyZSBJRFBzLiANCg0KYGBge3J9DQojIGNoZWNraW5nIHJlY3VycmVudCBiZW5lZmljaWFyaWVzIA0KZnNjICU+JSANCiAgZ3JvdXBfYnkoYmVuZWZpY2lhcmllc19yZWN1cnJlbmN5LCBkYXRlKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShwY19vZl90b3RhbCA9IGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGJlbmVmaWNpYXJpZXMpKSArDQogIGdlb21fbGluZSgpICsNCiAgZmFjZXRfd3JhcCh+IGJlbmVmaWNpYXJpZXNfcmVjdXJyZW5jeSwgc2NhbGVzID0gImZyZWVfeSIpDQoNCmZzYyAlPiUgIA0KICBncm91cF9ieShiZW5lZmljaWFyaWVzX3JlY3VycmVuY3ksIGZyZXF1ZW5jeSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBmaWx0ZXIoZnJlcXVlbmN5ID09ICJPdGhlciIpDQpgYGANCg0KDQpgYGB7cn0NCg0KIyBmb3Igc29tZSByZWFzb24sIHRoZSBtdXRhdGUgZmN0X3Jlb3JkZXIgaXMgbm90IHdvcmtpbmcNCiANCmZzYyAlPiUgDQogIGZpbHRlcihiZW5lZmljaWFyeV90eXBlICE9ICJOQSIpICU+JSANCiAgZ3JvdXBfYnkoYmVuZWZpY2lhcnlfdHlwZSkgJT4lIA0KICBtdXRhdGUoYXZnX2hoZCA9IGJlbmVmaWNpYXJpZXMgLyBob3VzZWhvbGRzLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZmN0X3Jlb3JkZXIoYmVuZWZpY2lhcnlfdHlwZSwgYXZnX2hoZCksIHkgPSBhdmdfaGhkKSkgKyANCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxNSkpICsNCiAgbGFicyh4ID0gIkJlbmVmaWNpYXJ5IHR5cGUiLCANCiAgICAgICB5ID0gIkF2ZXJhZ2UgaG91c2Vob2xkIHNpemUiKQ0KDQpgYGANCg0KYGBge3J9DQpmc2MgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcnlfdHlwZSA9IHN0cl90cmltKGJlbmVmaWNpYXJ5X3R5cGUpLA0KICAgICAgICAgKGJlbmVmaWNpYXJ5X3R5cGUgPSBhcy5jaGFyYWN0ZXIoZmN0X3JlY29kZShiZW5lZmljaWFyeV90eXBlLCANCiAgICAgICAgICAgICAgICJSYWtoaW5lIHN0YXRlbGVzcyIgPSAiTm9uLWRpc3BsYWNlZCBzdGF0ZWxlc3MgcGVvcGxlIGluIFJha2hpbmUiKSkpKSAlPiUNCiAgZmlsdGVyKGJlbmVmaWNpYXJ5X3R5cGUgIT0gIk5BIikgJT4lIA0KICBncm91cF9ieShiZW5lZmljaWFyeV90eXBlKSAlPiUgDQogDQogIG11dGF0ZShhdmdfaGhkX3NpemUgPSBiZW5lZmljaWFyaWVzIC8gaG91c2Vob2xkcywNCiAgICAgICAgIGJlbmVmaWNpYXJ5X3R5cGUgPSByZW9yZGVyKGJlbmVmaWNpYXJ5X3R5cGUsIGF2Z19oaGRfc2l6ZSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcnlfdHlwZSwgeSA9IGF2Z19oaGRfc2l6ZSkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAyMCkpICsNCiAgbGFicyh4ID0gIkJlbmVmaWNpYXJ5IHR5cGUiLCANCiAgICAgICB5ID0gIkF2ZXJhZ2UgaG91c2Vob2xkIHNpemUiKQ0KDQpgYGANCg0K